#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>

typedef struct // ������Ϣ���ݺͽ��յ��Զ�����������
{
	long int nType;	  // ����
	char szText[256]; // ����
} MSG;

int creatqueue() // ������Ϣ����
{
	key_t Ikey;									// ��ֵ
	int nMsgld;									// ��Ϣ���б�ʶ��
	if ((Ikey = ftok("/etc/profile", 1)) == -1) // ����ftok���ɼ�ֵ
	{
		perror("ftok"); // ��ʾ������Ϣ
		exit(1);
	}
	if ((nMsgld = msgget(Ikey, IPC_CREAT | 0666)) == -1) // �����в����ڣ�������Ϣ���У������д��ڣ�����EEXIST
	{
		if (errno != EEXIST) // ����ʧ�ܲ��Ҳ������ڶ����Ѿ�����
		{
			perror("msgget"); // ����perror��ʽ��������Ϣ���������ʾ������Ϣ
			exit(2);
		}
		if ((nMsgld = msgget(Ikey, 0)) == -1) // �����Ѵ���
		{
			perror("msgget"); // �����Ѿ����ڣ�����msgget������Ϣ���б�ʶ��
			exit(3);
		}
	}
	return nMsgld; // ������Ϣ����������
	return 0;
}

int sentMSG(MSG getm, int nMsgld) // ��Ϣ����--��Ϣ�ṹ�ͱ�ʶ��
{
	MSG msg;
	memset(&msg, 0x00, sizeof(MSG)); // ��ն��нṹ
	msg.nType = getm.nType;
	strcpy(msg.szText, getm.szText);
	if (msgsnd(nMsgld, (void *)&msg, strlen(msg.szText), 0) < 0) // ������������Ϣ
	{
		perror("msgsnd");
	}
	return 0;
}

int creatpipe()
{
	if (mkfifo("pp", 0644) < 0) // ����ppͨ���ļ�������Ȩ��Ϊ644
	{
		perror("mkfifo");
		exit(-1);
	}
	return 0;
}

int readpipe1()
{
	int fd = -1;
	int data_fd1 = -1;
	int data_fd2 = -1;
	int bytes_write = 0;
	int res = 0;
	if ((fd = open("pp", O_RDONLY, 0)) < 0)
	{
		perror("open");
		exit(-1);
	}
	else
	{
		char buff[80];
		memset(buff, 0x00, sizeof(buff));		// ��ջ�����
		data_fd1 = open("front.txt", O_WRONLY); // ֻд���ļ�
		res = read(fd, buff, PIPE_BUF);
		bytes_write = write(data_fd1, buff, res); // ��ȡͨ���е����ݣ��������������ļ�pre.txt�ļ���
		data_fd2 = open("front.txt", O_RDONLY);	  // ֻ�����ļ�
		read(data_fd2, buff, sizeof(buff));
		printf("%s\n", buff);
		close(data_fd1);
		close(fd);
	}
	return 0;
}

int readpipe2()
{
	int fd = -1;
	if ((fd = open("pp", O_RDONLY, 0)) < 0)
	{
		perror("open");
		exit(-1);
	}
	else
	{
		close(fd);
	}
	return 0;
}

int main()
{

	pid_t pid; // ���̱�ʶ����
	signal(SIGCLD, SIG_IGN);
	// switch (pid = fork())
	// {
	// case -1:
	// 	perror("fork");
	// 	break;
	// case 0:
	// 	if (execl("./back", "back", (char *)0) == -1) // ���Ӻ�̨
	// 	{
	// 		perror("execl");
	// 	}
	// 	break;
	// default:
	// {
		printf("%d\n", pid);
		MSG m;
		int nMsgld;
		char ch[30]="dir\n";
		char ch2[30];
		char *str;
		creatpipe();
		nMsgld = creatqueue();
		while (1)
		{
			printf("(Windows����Linux�������dir����ls��rename����mv��move����mv�� del����rm��cd����cd��pwd����exit����exit)\n");

			// strcpy(ch, "");
			strcpy(ch2, "");
			printf("������windowsָ��:");
			// fgets(ch, sizeof(ch), stdin);
			ch[strlen(ch) - 1] = '\0';
			if (!strcmp("dir", ch))
			{
				strcat(ch2, "ls");
				printf("%s����Ӧlinuxָ��:%s\n", ch, ch2);
				m.nType = 2;
				memcpy(m.szText, ch2, sizeof(ch2));
				sentMSG(m, nMsgld);
				sleep(3);
				readpipe1();
				printf("\n");
			}
			else if (!strcmp("cd", ch))
			{
				strcat(ch2, "pwd");
				printf("%s����Ӧlinuxָ��:%s\n", ch, ch2);
				m.nType = 2;
				memcpy(m.szText, ch2, sizeof(ch2));
				sentMSG(m, nMsgld);
				readpipe1();
				printf("\n");
			}
			else if (!strcmp("exit", ch))
			{
				m.nType = 2;
				strcat(ch2, "exit");
				printf("%s����Ӧlinuxָ��:%s\n", ch, ch2);
				printf("###############��������!#################\n");
				memcpy(m.szText, ch, sizeof(ch));
				sentMSG(m, nMsgld);
				readpipe2();
				printf("\n");
				break;
			}
			else
			{
				char *temp = strtok(ch, " "); // �ֽ�
				char ch1[15], ch0[15];
				strcpy(ch1, "");
				strcpy(ch0, "");
				strcat(ch1, temp);
				while (temp)
				{
					if (!strcmp("rename", temp))
					{
						strcat(ch2, "mv");
						strcat(ch0, "mv");
					}
					else if (!strcmp("move", temp))
					{
						strcat(ch2, "mv");
						strcat(ch0, "mv");
					}
					else if (!strcmp("del", temp))
					{
						strcat(ch2, "rm");
						strcat(ch0, "rm");
					}
					else
					{
						strcat(ch2, " ");
						strcat(ch2, temp);
					}
					temp = strtok(NULL, " "); // ��һ����
				}
				// printf("%s\n",ch2);
				printf("%s����Ӧlinuxָ��:%s\n", ch1, ch0);
				printf("\n");
				m.nType = 2;
				memcpy(m.szText, ch2, sizeof(ch2));
				sentMSG(m, nMsgld);
				readpipe2();
			}
		}
		unlink("./pp"); // ɾ���ܵ�
	// 	break;
	// }
	// }
	return 0;
}
